﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Excel = Microsoft.Office.Interop.Excel;
using System.Data.Linq;
using System.Data.Linq.Mapping;

namespace Read_And_Store
{
    class Program
    {
        static void Main(string[] args)
        {
            // Acede ao ficheiro Excel.
            Excel.Application xlApp = new Excel.Application();
            Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"C:\Users\Eduardo\Desktop\lp1415-6033\Trabalho Pratico C#\srccsharp\Read_And_Store\Read_And_Store\IPC_Portugal_1977_2013.xls");
            Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
            Excel.Range xlRange = xlWorksheet.UsedRange;

            // Obtem o nº de linhas e colunas do ficheiro.
            int rowCount = xlRange.Rows.Count;
            int colCount = xlRange.Columns.Count - 24; // O -24 corrige o nº de colunas.

            // Cria a base de dados e apaga a versão antiga se existir.
            Database db = new Database(@"C:\Users\Eduardo\Desktop\lp1415-6033\Trabalho Pratico C#\srccsharp\Read_And_Store\Read_And_Store\database_ipc.mdf");
            if (db.DatabaseExists())
            {
                Console.Write("Deleting old database...\n");
                db.DeleteDatabase();
            }
            db.CreateDatabase();


            // Este código é preliminar e não foi utilizado.

            //Guarda o nome dos campos da base de dados num array
            //string[] table_fields = new string[10];
            //table_fields[0] = "Id de Linha";

            //for (int i = 1; i <= table_fields.Length - 1; i++)
            //{
            //    table_fields[i] = xlRange.Cells[1, i + 1].Value2.ToString();
            //}

            // cria uma variável e array para conter os valores do ficheiro excel
            // enquanto são passados linha a linha para a base de dados.
            int line_number = 0;
            double[] table_values = new double[10];

            // percorre todas as linhas, saltando a dos cabeçalhos.
            for (int i = 2; i <= rowCount; i++)
            {
                line_number += 1;
                table_values[0] = line_number;
                Console.Write(table_values[0] + "\t");
                // Percorre todas as colunas, saltando a primeira que se encontra vazia.
                for (int j = 1; j <= colCount - 1; j++ )
                {
                    // Verifica se o valor da célula é null e substitui por 0 caso seja.
                    if(xlRange.Cells[i, j + 1].Value2 == null)
                        table_values[j] = 0;
                    else
                        table_values[j] = xlRange.Cells[i, j + 1].Value2;
                    Console.Write(table_values[j] + "\t");
                }
                Console.Write("\n");

                // Cria uma linha de dados para inserir na base de dados.
                Dados dados_ano = new Dados
                {
                    IdLinha = (int)table_values[0],
                    Ano = (int)table_values[1],
                    IPCGlobal = (float)table_values[2],
                    VariaAnual = (float)table_values[3],
                    RenumMin = (float)table_values[4],
                    RenumMax = (float)table_values[5],
                    PIB = (float)table_values[6],
                    RendNacBruto = (float)table_values[7],
                    RendDispBruto = (float)table_values[8],
                    Renumeracoes = (float)table_values[9]
                };

                // Coloca a linha criada na lista de espera.
                db.Dados.InsertOnSubmit(dados_ano);
            }

            // Submete todas as linhas na lista de espera para a base de dados.
            db.SubmitChanges();

            // Destroi o objecto/conecção da base de dados.
            db.Dispose();

            // Feicha e destroi os objectos relacionados com o ficheiro Excel.
            GC.Collect();
            GC.WaitForPendingFinalizers();

            Marshal.ReleaseComObject(xlRange);
            Marshal.ReleaseComObject(xlWorksheet);

            xlWorkbook.Close(0);
            Marshal.ReleaseComObject(xlWorkbook);

            xlApp.Quit();
            Marshal.ReleaseComObject(xlApp);

            Console.WriteLine("Press any key to continue...\n");

            Console.Read();
        }
    }

    // Cria a classe de criação da estrutura da base de dados.
    public class Database : DataContext
    {
        public Table<Dados> Dados;
        public Database(string connection) : base(connection) { }
    }

    // Cria a estrutura da tabela Dados da base de dados.
    [Table(Name = "Dados")]
    public class Dados
    {
        [Column(Name = "Id de Linha", IsPrimaryKey = true)]
        public int IdLinha;
        [Column(Name = "Ano")]
        public int Ano;
        [Column(Name = "IPC Global (1981 =100)")]
        public float IPCGlobal;
        [Column(Name = "Variação Anual (Taxa de Inflação)")]
        public float VariaAnual;
        [Column(Name = "remuneração miníma mensal")]
        public float RenumMin;
        [Column(Name = "remuneração máxima mensal")]
        public float RenumMax;
        [Column(Name = "PIB per capita anual")]
        public float PIB;
        [Column(Name = "Rendimento nacional bruto per capita anual")]
        public float RendNacBruto;
        [Column(Name = "Rendimento disponível bruto per capita anual")]
        public float RendDispBruto;
        [Column(Name = "Remunerações per capita anual")]
        public float Renumeracoes;
    }
}
